//mind.h

#pragma once
#include "MovesList.h"

//-----------------------------------------------------------------------
//							CMind
//							=====
//
// Geral :	Esta classe representa a IA do jogo
//
// Methods :	SetPGame		    - seta um ponteiro para a classe CPlay
//				SetDepth		    - seta a profundidade maxima para uma arvore
//				SetEngineChanges    - seta as mudancas feita por usuario com atribuicao de peso
//				GetEngineChanges    - retorna todas heuristicas
//				Finish              - seta a variavel que indica fim para true abortando a construcao da arvore
//				Start               - seta a variavel que indica fim para false
//
//				BuildTree		    - controi arvore de min-max
//				Think			    - chama a funcao que constroi arvore
//				SaveChanges         - quando construir a arvore salva as alteracoes
//				ChooseFromMulti     - escolhe a comida multipla a partir das possibilidade
//				Evaluate		    - retorna o tabuleiro
//				CountExchanges      - retorna o numero de operacoes feitas
//				CheckBalance        - retorna a diferenca do numero de pecas entre os dois lados do tabuleiro
//				CountFirstRows      - retorna a quantidade de pecas que estao na defensiva
//				CheckCenter         - retorna a quantidade de pecas no centro do tabuleiro
//				CheckPower		    - retorna a soma dos pesos das pecas
//				UpdateMinMax        - atualiza variaves de min-max
//				CheckAlphaBeta      - checa se pode utilizar corte alfa-beta
//			    CreatePossibleMoves - verifica as possiveis jogadas para cada peca
//
//-----------------------------------------------------------------------
class CPlay;
class CMind
{
	CPlay *m_pGame;
	int CurMove;
	bool Must_Jump;
	POINT m_Root;
	int DEPTH;
	bool NewGrade;
	int originalRed;
	int originalBlue;
	bool m_Finish;
	int _Random;
	int _Exchanges;
	int _Balance;
	int _FirstRows;
	int _Center;
	int _DiffPower;
public:
	CMind(void);
	~CMind(void);
	void Finish();
	void Start();
	void SetPGame(CPlay*);
	float BuildTree(int,int,CMovesList*,POINT,float,float); 
	void Think(int,HWND&);
	float Evaluate(int);
	void SaveChanges(POINT[],POINT,int,POINT,bool,int&,int&,int&);
	void RetrieveChanges(POINT[],POINT,bool,int,int,int,int);
	void ChooseFromMulti(CMovesNode**,CMovesNode*,float);
	int CountExchanges();
	void CheckBalance(int&,int&);
	void CountFirstRows(int,int&,int&);
	void CheckCenter(int&,int&);
	int CheckPower();
	void SetDepth(int);
	void SetEngineChanges(int,int,int,int,int,int);
	void GetEngineChanges(int&,int&,int&,int&,int&,int&);
	void MessageLoop();
	void CreatePossibleMoves(POINT,bool,POINT[]);
	void UpdateMinMax(float&,float&,float);
	float CheckAlphaBeta(int,float&,float&,float);
};
